package com.wenguo.bussines.service;

import java.util.List;
import java.util.Map;

import com.wenguo.bussines.model.Group;
import com.wenguo.bussines.model.Log;
import com.wenguo.bussines.model.User;
import com.wenguo.exception.WenGuoException;

/**
 * 所用业务逻辑接口
 */
public interface FacadeService {

	//------------- groupService ---------------------
	/**
	 * 列出所有用户组
	 * @return List&lt{@link Group}&gt
	 * @throws WenGuoException
	 */
	public List<Group> findAllGroup() throws WenGuoException;
	
	/**
	 * 通过用户组ID查找用户组
	 * @param id 用户组ID
	 * @return {@link Group}
	 * @throws WenGuoException
	 */
	public Group findGroupById(Integer id) throws WenGuoException;
    
    //------------- userService ---------------------
	/**
	 * 查询(部分或全部)注册用户的总记录数
	 * @param user 用户<p>
	 * 当参数 <code>user == null<code> 时，查询全部，反之查询部分
	 * <p>
	 * 查询部分时，参数 <code>user</code> 中只至少要包含用户账号(id)此属性
	 * <p>例如:<br>
	 *  <code>
	 *  Map<Object, Object> map = new HashMap<Object, Object>();<br>
	 *  map.put("id", "test");<br>
	 *  此时查询用户ID为test总记录数<br>
	 *  </code>
	 * @return Long 数量
	 * @throws WenGuoException
	 */
	public Long findCountOfUser(User user) throws WenGuoException;
	
	/**
	 * 通过分页条件查找用户记录
	 * @param map 分页条件<p>
	 *  map中应该包含<code>页数pageNo, 每页数量pageSize</code>
	 *  <br>如果参数<code> map == null </code>
	 *  则页数和每页数量为系统默认值 <code>pageNo = 1</code> 和 <code>pageSize = 11 </code>
	 *  <br>此时则查询系统第1页，每页大小为11的所有用户记录
	 *  <br>查找某一用户的记录再应该包含<code>用户ID</code>
	 *  <p>例如:<br>
	 *  <code>
	 *  Map<Object, Object> map = new HashMap<Object, Object>();<br>
	 *  map.put("id", "test");<br>
	 *  map.put("pageNo", 2);<br>
	 *  map.put("pageSize", 10);<br>
	 *  此时查询用户ID为test的第2页记录，每页大小为10
	 *  </code>
	 * @return List&lt{@link User}&gt 用户列表
	 * @throws WenGuoException
	 */
    public List<User> findUserByPage(Map<Object, Object> map) throws WenGuoException;
    
    /**
	 * 用户登录
	 * @param user 用户信息,包含用户账号, 用户密码
	 * @return {@link User} 
	 * 	如果用户登录成功,则返回用户全部信息<br>
	 *  如果用户登录失败(账号密码错误等),则返回null
	 * @throws WenGuoException
	 */
    public User login(User user) throws WenGuoException;
    
    /**
	 * 通过用户ID查找用户
	 * @param id 用户账号
	 * @return {@link User}
	 * @throws WenGuoException
	 */
    public User findUserById(String id) throws WenGuoException;
    
    /**
	 * 创建新用户
	 * @param user 用户全部setter属性
	 * @return true 或 false, 成功为true, 失败为false
	 * @throws WenGuoException
	 */
    public boolean createUser(User user) throws WenGuoException;
    
    /**
	 * 更新除用户密码之外的用户信息
	 * @param user 除用户密码(pass)之外全部setter属性
	 * @return true 或 false, 成功为true, 失败为false
	 * @throws WenGuoException
	 */
    public boolean updateUser(User user) throws WenGuoException;

    /**
	 * 更新用户密码
	 * @param user 仅包含用户密码(pass)属性
	 * @return true 或 false, 成功为true, 失败为false
	 * @throws WenGuoException
	 */
    public boolean updateUserPassword(User user) throws WenGuoException;
    
    /**
	 * 通过用户ID删除用户<p>
	 * 删除时会联级删除所有用户信息和登录记录
	 * @param id 用户账号
	 * @return true 或 false, 成功为true, 失败为false
	 * @throws WenGuoException
	 */
    public boolean deleteUserById(String id) throws WenGuoException;
    
    //------------- logService ---------------------
    /**
	 * 查询(部分或全部)用户登录记录的总记录数<p>
	 * @param log 登录记录<p>
	 * 当参数 <code>log == null<code> 时，查询全部，反之查询部分
	 * <p>
	 * 查询部分时，参数 <code>log</code> 中只至少要包含用户登录账号(id)此属性
	 * <p>例如:<br>
	 *  <code>
	 *  Map<Object, Object> map = new HashMap<Object, Object>();<br>
	 *  map.put("uid", "test");<br>
	 *  此时查询用户ID为test总登录记录的记录数<br>
	 *  </code>
	 * @return Long 数量
	 * @throws WenGuoException
	 */
    public Long findCountOfLog(Log log) throws WenGuoException;
    
    /**
	 * 通过分页条件查找登录记录
	 * @param map 分页条件<p>
	 *  map中应该包含<code>页数pageNo, 每页数量pageSize</code>
	 *  <br>如果参数<code> map == null </code>
	 *  则页数和每页数量为系统默认值 <code>pageNo = 1</code> 和 <code>pageSize = 11 </code>
	 *  <br>此时则查询系统第1页，每页大小为11的所有登录记录
	 *  <br>查找某一用户的登录记录再应该包含<code>用户ID</code>
	 *  <p>例如:<br>
	 *  <code>
	 *  Map<Object, Object> map = new HashMap<Object, Object>();<br>
	 *  map.put("uid", "test");<br>
	 *  map.put("pageNo", 2);<br>
	 *  map.put("pageSize", 10);<br>
	 *  此时查询用户ID为test的第2页登录记录，每页大小为10
	 *  </code>
	 * @return List&lt{@link Log}&gt 用户列表
	 * @throws WenGuoException
	 */
    public List<Log> findLogByPage(Map<Object, Object> map) throws WenGuoException;
    
    /**
     * 记录用户登录信息
     * @param log 登录信息
     * @return  true 或 false, 成功为true, 失败为false
     * @throws WenGuoException
     */
    public boolean WriteLog(Log log) throws WenGuoException;
	
}
